<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/6/18
 * Time: 22:59
 */
namespace App\Lib\Sdk\Spider;

use App\Lib\Request\Client;
use App\Lib\Request\ResultObject;
use App\Lib\Sdk\Robot\Service\Robot;
use App\Lib\Sdk\Spider\Service\Spider;
use App\Models\Forms\TbSpiderConfig;
use App\Models\Robots;
use App\Models\User;
use Encore\Admin\Admin;

/**
 * Class TaobaoSpider
 * @package App\Lib\Sdk\Spider
 *
 */
class TaobaoSpider extends BaseSpider  implements Spider
{

    protected $searchAble = [
        "para",
        'cat',
        'presale',
        'sort',
        'start_tk_rate',
        'end_price' ,
        'coupon',
        'page',
        "item_id",
        'vekey',
        'relationId',
        'pid'
    ];

    /**
     * @param array $tbSpiderConfig
     * @return mixed
     * 1、pid 参数： 必选，至少提供一个默认的PID参数，当搜索接口触发转链功能时，会用到。最好是渠道PID

    2、relationId 参数：可选，当搜索接口触发转链时，此渠道ID参数将做为转链参数。

    其它转链场景（返回值中search_type值为2）请参考万能转链接口hcapi的参数。



    （2）当仅搜索产品列表时，此super接口参数如下（均为非必须参数）：

    1、page 参数：传递当前页码值。默认1.

    2、pagesize 参数：传递每页最大显示数，默认15，最大值不要超过30.

    3、coupon 参数：当不传递coupon参数或coupon=0时，默认搜索包含无券产品，当传coupon=1时则搜索有券产品。



    4、start_price 和 end_price 参数：start_price 指折扣价范围下限，end_price 指折扣价范围上限，单位：元

    5、start_tk_rate 和 end_tk_rate 参数：end_tk_rate，淘客佣金比率上限，如：1234表示12.34%，start_tk_rate淘客佣金比率下限，注意是千位表示法，比如要限制佣金是10%，则start_tk_rate=1000而不是start_tk_rate=10

    6、is_overseas 参数：是否海外商品，is_overseas=1 指定为海外产品。默认为否。

    7、is_tmall 参数：是否商城商品，默认0（可选0或1），设为1表示商品是天猫商城商品，不设置或0表示不限制。

    8、cat 参数： 淘宝分类类目ID，用,分割，最大10个，该ID可以通过taobao.itemcats.get接口获取到。当传递了cat参数时，可以不必使用para参数，比如：

    http://apis.vephp.com/super?vekey=xxxxx&cat=50011129



    9、sort 参数：排序，默认 total_sales_des（销量降序），可选值如下：

    tk_rate_des（淘客佣金比率降序）,

    tk_rate_asc（淘客佣金比率升序）,

    total_sales_des（销量降序）,

    total_sales_asc（销量升序）,

    tk_total_sales_des（累计推广量降序）,

    tk_total_sales_asc（累计推广量升序）,

    tk_total_commi_des（总支出佣金降序）,

    tk_total_commi_asc（总支出佣金升序）,

    price_des（价格降序）,

    price_asc（价格升序）;


    10、onlysearch 参数（强制仅使用搜索）：可选，当指定 onlysearch=1 时，如果para参数是“淘口令、产品ID、二合一等各种淘宝链接”时，本接口默认是会直接把参数转入高佣API，得到该参数对应的产品推广详情和淘口令。但是指定“onlysearch=1”后，接口会把para参数中淘口令等解析后取得它对应的产品标题，并且它的标题去搜索，而不会进行高佣转链。

    11、similar 参数：可选值0和1（默认值0），是指自动使用找相似功能。默认是不找相似。当搜索中指定该参数为1时，则自动在发现非联盟产品时使用找相似功能。这时，返回值中字段 is_similar 表示是否为相似搜索，is_similar值为1表示近似产品搜索。

    12、ip 参数： 当需要限制包邮时，最好传递顾客的IP参数，比如：  ip=122.71.37.32 ，本参数最好和freeship一起使用。

    13、freeship 参数：是否只查包邮产品，默认值不限。如果只想要包邮产品，可以传递freeship=1

    14、npx 参数： 默认不设置。此参数指定牛皮癣程度，此参数影响主图美观度，可用取值范围：1-不限，2-无，3-轻微

    15、presale 参数（仅双11期间有效）：默认不设置，可选值1或0，当设置为1时，使用关键字搜索的商品均为双11预售商品。

    16、tklink 参数默认不设置，可选值1或0，返回的搜索结果直接带有您的推广链接。此时返回值的商品列表中，如果商品有券则多返回“coupon_share_url”（领券链接）和“url”（不领券但有佣金，直接跳到淘宝天猫），如果商品无券，则返回“url”链接。如果你同时传递relationId渠道ID参数，那么这两个链接会附加渠道ID值。

    17、item_id 参数，用于传递产品ID参数，当使用本参数时，para参数的如果是“关键词”搜索时将失效。接口返回该ID的产品信息。使用本参数时，onlysearch和similar同时失效。这时返回的是该ID的产品搜索结果，而非定向转链接口。

    如： http://api.vephp.com/super?vekey=xxx&item_id=580716515146
     *
     * 【重要：关于commission_rate佣金比率字段值不同的说明】

    接口返回值类型有2种：泛搜索和定向搜索，一定要看返回值search_type字段，返回值中search_type字段值为1时是泛搜索，2时是定向搜索（和万能转链hcapi接口一样）

    （1）泛搜索：这时接口返回search_type=1，返回值字段佣金比率“commission_rate”需要除以100，比如5000表示50%。

    （2）定向搜索：而如果搜索指定商品，此时search_type=2时，这时返回值中的commission_rate字段不需要除以100，是正常佣金百分值。如50.0表示50%
     */
    public function search(array $tbSpiderConfig)
    {
        $config = User::getConfig();
        if (empty($config['taobao_pid'])) {
            throw new \Exception("该用户未设置淘宝RID,请联系系统管理员!!");
        }
        $api = TaobaoApi::search;
        $tbSpiderConfig['vekey'] = $this->config['vekey'];
        $tbSpiderConfig['start_tk_rate'] = $tbSpiderConfig['start_tk_rate'] * 100;
        $params = array_merge($tbSpiderConfig, [  //其它参数
            'tklink' => 1,
            'pid' => $this->config['pid'],
            'relationId' => $config->taobao_pid   //rid
        ]);
        $filter = [];
        foreach ($this->searchAble as $key) {
            if (isset($params[$key])) {
                $filter[$key] = $params[$key];
            }
        }
        $res = $this->client->get($api, $filter);
        if ($res->error <= 0) {
            $data = $res
                ->result_list
                ->toArray();
         /*   foreach ($data as &$item) {
                $hcai =  $this->getHcai($item, $config['uid']);
                $item = array_merge($item, $hcai);
            }*/
            return $data;
        } else {
            $this->err = $res->msg;
            return false;
        }
    }

    public function searchV2(array $data)
    {
        $back = $data['page']*50;

        $res = file_get_contents('http://v2.api.haodanku.com/sales_list/apikey/zztxhdk/sale_type/1/cid/'.$data['cat'].'/back/'.$back.'/min_id/1');

        return \GuzzleHttp\json_decode($res, true);
    }

    public function getHcai($item, $uid, $external_id = "")
    {
        $api = TaobaoApi::getLink;
        $config = User::getConfig($uid);
        $params = [
            'para' => $item['item_id'],
            'vekey' => $this->config['vekey'],
            'pid' => $this->config['pid'],
            'relationId' => $config->taobao_pid,   //rid
            'external_id' => $external_id
        ];
        $res = $this->client->get($api, $params);
        $data = $res->data;
        return $data->tbk_pwd;
    }

    public function getTkl($item)
    {
        $api = TaobaoApi::getTkl;
        $params = [
            'vekey' => $this->config['vekey'],
            'text' => $item['short_title'],
            'url' => $item['url']
        ];
        try {
            $res = $this->client->get($api, $params);
            return $res->data->tbk_pwd;
        } catch (\Exception $e) {
            return "";
        }
    }

}